from pprint import pprint
from django.http import HttpRequest, HttpResponse, HttpResponseNotFound, JsonResponse
from django.shortcuts import render, redirect
from django.views import View

from book.models import BookInfo, PeopleInfo


# Create your views here.
def create_book(request):
    # book = BookInfo.objects.create(
    #     name='ab',
    #     pub_date='2000-1-1',
    #     readcount=10
    # )

    return HttpResponse('create')


def shop(request, city_id, mobile):
    # print(city_id, shop_id)

    # import re
    # if not re.match('\d{5}', shop_id):
    #     return HttpResponse('没有此商品')
    print(city_id, mobile)

    query_params = request.GET
    print(query_params)
    # order = query_params.get('order')
    order = query_params.getlist('order')
    print(order)
    return HttpResponse('xx小饭店')


# <QueryDict: {'order': ['readcount', 'commencount'], 'page': ['1']}>
# QueryDict 具有字典的特性 还具有一键多值


'''
查询字符串
http://ip:port/path/?key=value&key1=value1

url以 ? 分割，分为两部分
？前为请求路径
？后为查询字符串  类似于字典 用&拼接

'''


def register(request):
    data = request.POST
    print(data)
    return HttpResponse('ok')


def json(request: HttpRequest):
    # JSON不能用post接受
    body = request.body
    print(body)
    # b'{\r\n    "code": "200",\r\n    "name": "xiaoming",\r\n    "age": 10\r\n}'
    body_str = body.decode()
    print(body_str)
    print(type(body_str))

    # {
    #     "code": "200",
    #     "name": "xiaoming",
    #     "age": 10
    # }
    # 注：此处类型为字符串

    # JSON形式的字符串可以转换为字典
    import json
    body_dict = json.loads(body_str)
    print(body_dict)
    print(type(body_dict))

    print(request.META)  # 请求头
    print(request.META['SERVER_PORT'])

    return HttpResponse('json')


def method(request: HttpRequest):
    print(request.method)
    print(request.user)
    print(request.path)
    print(request.encoding)
    print(request.FILES)
    return HttpResponse('method')


def response(request: HttpRequest):
    # ------------------------------------------------------------------------HttpResponse的使用
    # HttpResponse(content=响应体,content_type=响应体数据类型,status=状态码)
    # _response = HttpResponse('res', status=200)
    # _response['name'] = 'xiaoming'  # 给响应头设置数据
    # return _response

    # ------------------------------------------------------------------------JsonResponse的使用
    # info = {
    #     'name': 'xiaoming',
    #     'address': 'beijing'
    # }
    girl_friends = [
        {
            'name': 'rose',
            'address': 'beijing'
        },
        {
            'name': 'jack',
            'address': 'shanghai'
        }
    ]
    # In order to allow non-dict objects to be serialized set the safe parameter to False.

    # data 返回的响应数据 一般是字典类型
    # safe=Ture 表示data为字典型数据
    # JsonResponse 可以把字典转换为json
    # 如果传了一个非字典数据 ， 出问题需要自己负责 使 safe=False

    # json.loads -> 将JSON字符串转换为字典
    # json.dumps -> 将字典转换为JSON字符串
    # _response = JsonResponse(data=girl_friends, safe=False)
    # return _response

    # ------------------------------------------------------------------------json.dumps使用
    # import json
    # data = json.dumps(girl_friends)
    # _response = HttpResponse(data)
    # return _response

    # ------------------------------------------------------------------------重定向
    return redirect('http://www.baidu.com')

    # ------------------------------------------------------------------------状态码
    # status
    # 1xx
    # 2xx  200成功
    # 3xx
    # 4xx  请求有问题 如：404找不到页面，路由有问题  403禁止访问，权限问题  405请求方式不被允许，因为Django的视图函数没有实现响应的方法
    # 5xx


### COOKIE和SESSION
# 在客户端存储信息使用Cookie
# 在服务端存储信息使用Session

"""
第一次请求，携带查询字符串
http://127.0.0.1:8000/set_cookie/?username=xiaoming&password=123
服务器接受到请求之后，获取username,服务器设置cookie信息，cookie信息包括username
浏览器接收到服务器的响应之后，应该把cookie保存起来

第二次及以后的请求，我们访问http://127.0.0.1:8000/  都会鞋带cookie信息；服务器就可以读取cookie信息，来判断用户身份
"""


## COOKIE
def set_cookie(request: HttpRequest):
    # 1.获取查询字符串数据
    username = request.GET.get('username')
    password = request.GET.get('password')
    print(username)
    # 2.服务器设置cookie信息
    # 通过响应对象.set_cookie 方法
    _response = HttpResponse('set_cookie')
    # max_age 是一个秒数 从响应开始 计时的一个秒数
    _response.set_cookie(key='name', value=username, max_age=60 * 60)  # 设置一个小时
    _response.set_cookie(key='pwd', value=password)

    # 删除cookie
    # _response.delete_cookie('name')

    return _response

    # 注：不设置到期时间时，到期时间为浏览器会话结束时，就是将浏览器关掉cookie就没有了


def get_cookie(request: HttpRequest):
    # 获取cookie 类型为字典数据
    print(f'COOKIES:{request.COOKIES}')
    name = request.COOKIES.get('name')
    return HttpResponse(name)


## Session
# session保存在服务器端  -- 数据相对安全
# session需要依赖于cookie

"""
第一次请求
http://127.0.0.1:8000/set_session/?username=xiaoming
时，我们在服务器端设置session信息。
服务器同时会生成一个session的cookie信息。
浏览器接收到这个信息后，会吧cookie数据保存起来

第二次及其之后的请求，都会携带这个sessionid。
服务器会验证这个sessionid，如果验证没有问题会读取相关数据，实现业务逻辑
"""


def set_session(request: HttpRequest):
    # 1.模拟获取用户信息
    username = request.GET.get('username')
    # 2.设置session信息
    # 加入我们通过模型查询 查询到了用户的信息
    user_id = 1
    request.session['user_id'] = user_id
    request.session['username'] = username

    # clear 删除session里的数据，但是key有保留
    # request.session.clear()
    # flush 删除session里的所有的数据，包括key
    # request.session.flush()
    # del删除
    # del request.session['user_id']

    # 如果value是一个证书，session将在value秒没有活动过后过期
    # 如果value为0，那么用户session的Cookie将在用户浏览器关闭时过期
    # 如果value为None，那么session有效期将采用系统默认值，默认为两周，可以通过在setting.py中设置
    # SESSION_COOKIE_AGE来设置全局默认值
    # request.session.set_expiry(value=1)

    return HttpResponse('set_session')

    # redis
    # select 14
    # keys *

    # type :1:django.contrib.sessions.cachesg38n3vv399hsphr79emd7d7n25ne1hx  --结果->  string

    # get :1:django.contrib.sessions.cachesg38n3vv399hsphr79emd7d7n25ne1hx
    # --结果->"\x80\x04\x95'\x00\x00\x00\x00\x00\x00\x00}\x94(\x8c\auser_id\x94K\x01\x8c\busername\x94\x8c\bxiaoming\x94u."


def get_session(request: HttpRequest):
    user_id = request.session.get('user_id')  # 使用get可以避免查不到数据报错的异常
    username = request.session['username']
    content = f'user_id:{user_id}\nusername:{username}'
    return HttpResponse(content)


## 类视图
def login(request: HttpRequest):
    if request.method == 'GET':
        return HttpResponse('get 逻辑')
    else:
        return HttpResponse('post 逻辑')


"""
类视图的定义
class 类视图名称(View):
    def get(self,request):
        return HttpResponse('xxx')
        
    def http_method_lower(self,request):
        return HttpResponse('xxx')
        
1.继承自View
2.类视图中的方法 是采用http方法小写来区分不同的请求方式
"""


class LoginView(View):
    def get(self, request):
        return HttpResponse('get,get')

    def post(self, request):
        return HttpResponse('post,post')


# as_view理解
# class Person(object):
#     # 对象方法
#     def play(self):
#         pass
#
#     @classmethod
#     def say(cls):
#         print(123)
#
#     @staticmethod
#     def eat():
#         pass
#
# Person.say()
# people=Person
# people.say()


##
"""
我的订单、个人中心页面
如果登陆用户 可以访问
如果未登录 不应该访问，应该跳转到登陆页面

定义一个订单、个人中心 类视图

如何定义是否登陆？  以登陆后台站点为例
"""

from django.contrib.auth.mixins import LoginRequiredMixin


# LoginRequiredMixin 作用：判断只有登陆用户才可以访问页面
class OrderView(LoginRequiredMixin, View):
    def get(self, request: HttpRequest):
        # 模拟一个标记为
        # isLogin = True
        # if not isLogin:
        #     return HttpResponse('尚未登录，正在跳转到登陆页面~~~')
        return HttpResponse('GET我的订单,必需要登陆')

    def post(self, request: HttpRequest):
        return HttpResponse('POST我的订单,必需要登陆')


"""
多继承
Python，C++
"""
